/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.json.JSONObject;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.entidades.Beneficiario;
import sv.com.compassion.entidades.Salida;
import sv.com.compassion.entidades.Tiposalida;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;

/** Clase para mantenimiento de Salidas . 
* @author grupo de Tesis
*/
public class SalidaAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private Salida salida;
    private String idTipoSalida;
    private String comAdd;
    private String idBeneficiario;
    
  /*  private String nomBen;
    private String apeBen;*/
    
    private String fecSal;
    private String codben;
    private String idTipoSal;
    private String idCdi;
    private String VERhis;
 
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a la clase entidad Salida. 
 */    
public SalidaAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        salida = new    Salida();
        
        salida.setIdTipoSalida(new Tiposalida());
        salida.setIdBeneficiario(new Beneficiario());
}

/**
 * Busca el método que se ejecutara
 */

    @Override
    public String execute(){
        buscarMetodo(salida);        
        return null;
    }
 /**
 * @param objeto de la entidad Salida
 * Agrega Salidas de Beneficiarios, haciendo uso de la entidad Salida.
 */         
    @Override    
    public void agregarEntidad(Object o) {
       
        Salida s;
        
        idTipoSalida = getRequest().getParameter("IdTipoSalida");
        comAdd = getRequest().getParameter("ComAdd");
        idBeneficiario = getRequest().getParameter("IdBeneficiario");
        
        try{
           Date    date    =   new Date();
           s = (Salida)o;
            
           Map session = ActionContext.getContext().getSession();
           String idUsuario = session.get("idUsuario").toString();
            
           Calendar cal = Calendar.getInstance();
           date=cal.getTime();
            
           setIdTipoSalida(Integer.parseInt(idTipoSalida));
           setIdBeneficiario(Integer.parseInt(idBeneficiario));
            
           setComAdicionales(comAdd);
            
           s.setAuAddUsr(Integer.parseInt(idUsuario));
           s.setAuAddDat(date);

           Date    fechaSalida    =   new Date();
           Calendar calx = Calendar.getInstance();
                
           fechaSalida = calx.getTime();
           
           setFecSalida(fechaSalida);
           
           genericoDAO.save(s);

        }catch(Exception e){
            Logger.getLogger(SalidaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
        
    }
 /**
 * @param objeto de la entidad Salida
 * Modifica el registro que se recibe de parámetro a inactivo (-1)
 */      
    @Override
    public void borrarEntidad(Object o) {
        List<Beneficiario> listBeneficiario;
        List<Salida> listSalida;
        Beneficiario b;
        Salida s;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        
        Date date = new Date();
        
        try{
            if(getId()!=null){
                listSalida = genericoDAO.find("SELECT s FROM Salida s WHERE s.idSalida = " + getId(), null, null);
            
               if(!listSalida.isEmpty()){
                    s = listSalida.get(0);
                    
                    Calendar cal = Calendar.getInstance();
                    date=cal.getTime();
                    
                    s.setAuModUsr(Integer.parseInt(idUsuario));
                    s.setAuModDat(date);
                    
                    genericoDAO.update(s);
                }
                
                //////////**************//////////
                
                listBeneficiario = genericoDAO.find("SELECT b FROM Beneficiario b WHERE b.idBeneficiario = (SELECT s.idBeneficiario FROM Salida s WHERE s.idSalida = " + getId() + ")", null, null);
                if(!listBeneficiario.isEmpty()){
                    b = listBeneficiario.get(0);
                    b.setEstBeneficiario(-1);
                    genericoDAO.update(b);
                }
            }            
        }catch(Exception e){
            Logger.getLogger(SalidaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }   
    @Override
    public void editarEntidad(Object o) {
    }
 /**
 * Este método realiza las búsquedas de las Salidas previamente realizadas en el mantenimiento Administración de Beneficiarios, esté método
 * espera los filtros opcionales:
 *       fecSal,
 *       idTipoSal,
 *       idCdi, 
 *       VERhis,
 *       codben
 */    
    @Override
    public void alimentarGrid() {
       JqGrid jg = new JqGrid();
        int total = 0;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
        
        List<Salida> listaSalida = null;
        String query="";
   /*     nomBen = getRequest().getParameter("NomBen");
        apeBen = getRequest().getParameter("ApeBen");*/
        fecSal = getRequest().getParameter("FecSal");
        idTipoSal = getRequest().getParameter("IdTipoSal");
        idCdi = getRequest().getParameter("IdCdi");
        VERhis = getRequest().getParameter("VERhis");
        codben = getRequest().getParameter("codben");
      /*  String nomBenquery = "";
        String apeBenquery = "";*/
        String codBenquery = "";
        String fecSalquery = "";
        String idTipoSalquery = "";
        String idCdiquery = "";
        String queryAux = "";
        if(idCargo.equals("6")){
            queryAux = "s.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "')) and ";
        }
      //  nomBenquery = "s.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.nomBeneficiario like upper('%" + nomBen + "%')) ";
        if(!fecSal.equals("") || !idTipoSal.equals("") || !idCdi.equals("") || !codben.equals("")){
             /*   if(!apeBen.equals("")){
                    apeBenquery = "and s.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.apeBeneficiario like upper('%" + apeBen + "%')) ";
                }*/
                if(!codben.equals("")){
                    codBenquery = "  s.idBeneficiario IN (SELECT b.idBeneficiario  FROM Beneficiario b where  b.codBeneficiario like upper('%" + codben + "%')) and ";
                }
                if(!fecSal.equals("")){
                    fecSalquery = " s.fecSalida = '" + fecSal + "' and ";
                }
                if(!idTipoSal.equals("")){
                    idTipoSalquery = " s.idTipoSalida = '" + idTipoSal + "' and ";
                }
                 if(!idCdi.equals("")){
                    idCdiquery = " s.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.idCdi = '" + idCdi + "') and ";
                }
        }
        String verHistorial;
        String verHistorialTemp = "";
        if(VERhis.equals("true")){
            verHistorial = "0";
            verHistorialTemp = "-1";
        }else{
            verHistorial = "0";
            verHistorialTemp = "0";
        }
        try{
                if(getSearch()!= null && getSearch().equals("true")){
                    
                }else{
                    
                    query = "SELECT s FROM Salida s WHERE " +
                                queryAux +
                              //  nomBenquery +
                              //  apeBenquery +
                                codBenquery +
                                fecSalquery +
                                idTipoSalquery +
                                idCdiquery +
                                " s.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.estBeneficiario like upper('" + verHistorial + "') or b.estBeneficiario like upper('" + verHistorialTemp + "'))"
                                + " ORDER BY s.fecSalida " + getSord();
                }

                listaSalida = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
                query = "SELECT COUNT(s) FROM Salida s WHERE " +
                                queryAux +
                              /*  nomBenquery +
                                apeBenquery +*/
                                codBenquery +
                                fecSalquery +
                                idTipoSalquery +
                                idCdiquery +
                                " s.idBeneficiario IN (SELECT b.idBeneficiario FROM Beneficiario b WHERE b.estBeneficiario like upper('" + verHistorial + "') or b.estBeneficiario like upper('" + verHistorialTemp + "'))";
                total = genericoDAO.countRow(query);
                //configuraciones basicas
                jg.setPage(getPage());
                jg.setRecords(total);
                jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                jg.setSord(getSord());
                jg.setSidx(getSidx());
                List<RowsGrid> rows = new ArrayList<RowsGrid>();
                
                for(Salida s: listaSalida){
                    RowsGrid r = new RowsGrid(); 
                    r.setId(s.getIdSalida().toString());
                    List cell = new ArrayList();
                    
                    cell.add(s.getIdTipoSalida().getIdTipoSalida());
                    cell.add(s.getIdTipoSalida().getNomTipoSalida());
                                       
                    cell.add(s.getFecSalida().toString());
                    
                    cell.add(s.getComAdicionales());
                    
                    cell.add(s.getIdBeneficiario().getCodBeneficiario());
                    
                    cell.add(s.getIdBeneficiario().getIdBeneficiario());
                    cell.add(s.getIdBeneficiario().getNomBeneficiario() + " " + s.getIdBeneficiario().getApeBeneficiario());
                    
                    cell.add(s.getIdBeneficiario().getIdCdi().getIdCdi());
                    cell.add(s.getIdBeneficiario().getIdCdi().getNomCdi());
                    
                    if(s.getIdBeneficiario().getEstBeneficiario() == 1){
                        cell.add("Activo");
                    }else{
                        if(s.getIdBeneficiario().getEstBeneficiario() == 0){
                            cell.add("En Proceso");
                        }else{
                            cell.add("Inactivo");
                        }
                    }
                    
                    cell.add(s.getAuAddUsr());
                    cell.add(s.getAuAddDat().toString());
                    
                    r.setCell(cell);
                    rows.add(r);
                }

                jg.setRows(rows);
                JSONObject jo = JSONObject.fromObject(jg);
                enviarJsonNavegador(getResponse(), jo);
        }catch(Exception e){
            Logger.getLogger(SalidaAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }

    public Integer getIdSalida() {
        return salida.getIdSalida();
    }

    public void setIdSalida(Integer idSalida) {
        salida.setIdSalida(idSalida);
    }

    public String getComAdicionales() {
        return salida.getComAdicionales();
    }

    public void setComAdicionales(String comAdicionales) {
       salida.setComAdicionales(comAdicionales);
    }

    public int getAuAddUsr() {
        return salida.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        salida.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(salida.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            salida.setAuAddDat(Fecha.string2Date(auAddDat));
        } catch (ParseException ex) {
            Logger.getLogger(SalidaAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Integer getAuModUsr() {
        return salida.getAuModUsr();
    }

    public void setAuModUsr(Integer auModUsr) {
        salida.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return salida.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
       salida.setAuModDat(auModDat);
    }

    public Integer getIdTipoSalida() {
        return salida.getIdTipoSalida().getIdTipoSalida();
    }

    public void setIdTipoSalida(Integer idTipoSalida) {
        salida.getIdTipoSalida().setIdTipoSalida(idTipoSalida);
    }
    
    public Integer getIdBeneficiario() {
        return salida.getIdBeneficiario().getIdBeneficiario();
    }

    public void setIdBeneficiario(Integer idBeneficiario) {
        salida.getIdBeneficiario().setIdBeneficiario(idBeneficiario);
    }
    
    public Date getFecSalida() {
        return salida.getFecSalida();
    }

    public void setFecSalida(Date fecSalida) {
        salida.setFecSalida(fecSalida);
    }
   
    @Override
    public void reporteXls() {
    } 
}
